package logica;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import modeloDatos.Curso;
import modeloDatos.CursosVistaReducida;
import modeloDatos.GrupoVistaReducida;

import persistencia.DAOCursos;
import utiles.Utiles;

public class OperacionesCursos {
	private DAOCursos instanciaDaoC;
	private Utiles util;
	
	public OperacionesCursos(){
		this.instanciaDaoC = new DAOCursos();
		this.util = new Utiles();
	}
	
	public List<CursosVistaReducida> realizarBusquedaCursos(String descripcion, String tipoCurso, String requisitosCurso, String entidad, String especialidad){
		
		List<CursosVistaReducida> salida = new LinkedList<CursosVistaReducida>();
		Map<String,String> criterios = new HashMap<String, String>();
		criterios.put("tipoCurso", tipoCurso);
		criterios.put("requisitosCurso", requisitosCurso);
		salida = instanciaDaoC.recuperaBusqueda(criterios);
		if(!descripcion.equals("ninguno")){
			salida = filtrarDescripcionCurso(salida, descripcion);
		}
		if(!entidad.equals("ninguno")){
			salida = filtrarEntidadCurso(salida, entidad);
		}
		if(!especialidad.equals("ninguno")){
			salida = filtrarEspecialidadCurso(salida, especialidad);
		}
		return salida;
	}
	
	public List<String> consultaTiposCurso(){
		return instanciaDaoC.recuperaTiposCurso();		
	}
	
	public List<String> consultaEntidadesCurso(){
		return instanciaDaoC.recuperaEntidadesCurso();
	}
	
	public List<String> consultaEspecialidadesCurso(){
		return instanciaDaoC.recuperaEspecialidadesCurso();
	}
	
	public List<String> consultaRequisitosCurso(){
		return instanciaDaoC.recuperaRequisitosCurso();
	}
	
	public List<CursosVistaReducida> consultaTodosCursos(){
		return instanciaDaoC.recuperaTodosCursos();
	}
	
	public List<CursosVistaReducida> filtrarDescripcionCurso(List<CursosVistaReducida> lC, String dCB){
		List<CursosVistaReducida> resList = new LinkedList<CursosVistaReducida>();
		for(CursosVistaReducida c : lC){
			if(c.getDescripcion().toLowerCase().matches(dCB.toLowerCase())){
				resList.add(c);
			}else if(c.getDescripcion().toLowerCase().contains(dCB.toLowerCase())){
				resList.add(c);
			}
		}
		return resList;
	}
	
	public List<CursosVistaReducida> filtrarEntidadCurso(List<CursosVistaReducida> lC, String eNCB){
		List<CursosVistaReducida> resList = new LinkedList<CursosVistaReducida>();
		for(CursosVistaReducida c : lC){
			if(c.getEntidad().toLowerCase().matches(eNCB.toLowerCase())){
				resList.add(c);
			}else if(c.getEntidad().toLowerCase().contains(eNCB.toLowerCase())){
				resList.add(c);
			}
		}
		return resList;
	}
	
	public List<CursosVistaReducida> filtrarEspecialidadCurso(List<CursosVistaReducida> lC, String eSCB){
		List<CursosVistaReducida> resList = new LinkedList<CursosVistaReducida>();
		for(CursosVistaReducida c : lC){
			if(c.getEspecialidad().toLowerCase().matches(eSCB.toLowerCase())){
				resList.add(c);
			}else if(c.getEspecialidad().toLowerCase().contains(eSCB.toLowerCase())){
				resList.add(c);
			}
		}
		return resList;
	}
	
	public Curso consultarCurso(String idCurso){
		Curso res = null;
		res = instanciaDaoC.recuperarCurso(idCurso);
		return res;
	}
	
	public boolean guardarModificacionCurso(Curso cursoModificado){
		boolean sinProblemas = true;
		if(verificaCurso(cursoModificado) && (instanciaDaoC.recuperarCurso(cursoModificado.getIdCurso())!=null)){
			sinProblemas = instanciaDaoC.modificaCurso(cursoModificado);
		}else{
			sinProblemas = false;
		}
		return sinProblemas;
	}
	
	public boolean insertarNuevoCurso(Curso cursoNuevo){
		boolean sinProblemas = true;
		if(verificaCurso(cursoNuevo) && (instanciaDaoC.recuperarCurso(cursoNuevo.getIdCurso())==null)){
			sinProblemas = instanciaDaoC.insertaCurso(cursoNuevo);
		}else{
			sinProblemas = false;
		}
		return sinProblemas;		
	}
	
	public boolean verificaCurso(Curso cursoNuevo){
		boolean bienVerificado = true;
		
		if(cursoNuevo.getDescripcion().equals("") || (cursoNuevo.getHoras() < 1) || 
				cursoNuevo.getEspecialidad().equals("") || cursoNuevo.getEntidad().equals("") ||
				cursoNuevo.getTipo().equals("") || cursoNuevo.getRequisitos().equals(""))
			bienVerificado = false; 
		
		return bienVerificado;
	}
	
	public List<GrupoVistaReducida> consultarGruposCurso(String idCurso){
		return instanciaDaoC.recuperaGruposCurso(idCurso);
	}
	
	public boolean borrarCursoActual(String idCurso){
		return instanciaDaoC.borrarCurso(idCurso);
	}
	
	public boolean borrarGrupoActual(String idGrupo){
		return instanciaDaoC.borrarGrupo(new Integer(idGrupo));
	}
	
}
